/**
* \file		Entrepot.h
* \brief	Définit la structure de l'entrepôt
* \details	C'est ici que sont définis la structure de l'entrepôt, ses
*		accesseurs, ses mutateurs.
*/

#ifndef ENTREPOT_H
#define ENTREPOT_H

/**
* \brief	Informations définissant l'entrepôt.
* \details	Ces informations sont les quantités des différentes matières
*               de base permettant au clan de perdurer et de prospérer.
*/

typedef struct
{
  int bois;		/*!<Quantité de bois entreposée : entier */
  int metal;		/*!<Quantité de métal entreposée : entier */
  int houblon;		/*!<Quantité de houblon entreposée : entier */
  int biere;		/*!<Quantité de bière entreposée : entier */
  int nourriture;	/*!<Quantité de nourriture entreposée : entier */
  int modifProduction;  /*!<Modificateur lié aux technologies : entier */
} Entrepot;

/*========================== Gestion de la mémoire ==========================*/
/**
* \brief	Initialise le contenu de l'Entrepôt
* \details	Met à zéro toutes les ressources contenues dans l'entrepôt
* \param	pstock		Pointeur sur l'Entrepôt
*/
void initRessourcesEntr(Entrepot *pstock);

/**
* \brief	Crée un Entrepôt
* \details	Crée une entrepôt et l'initialise grâce à initRessourcesEntr.
* \param	pnouvEntr	pointeur sur l'adresse de l'entrepôt à créer
*/
void creerEntr(Entrepot **pnouvEntr);

/**
* \brief	Libère la mémoire allouée pour un Entrepot donné
* \param	pentr		Pointeur vers l'entrepôt à détruire
*/
void detruireEntr(Entrepot *pentr);

/*============================= Accesseurs =============================*/
/**
* \brief	Retourne la quantité de bois stockée dans l'entrepôt
* \details	Retourne la quantité de bois stockée dans l'entrepôt et
*		vérifie sa validité (ne doit pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \return	Un entier non signé
*/
unsigned int getBoisEntr(const Entrepot *pstock);

/**
* \brief	Retourne la quantité de métal stockée dans l'entrepôt
* \details	Retourne la quantité de métal stockée dans l'entrepôt et
*		vérifie sa validité (ne doit pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \return	Un entier non signé
*/
unsigned int getMetalEntr(const Entrepot *pstock);

/**
* \brief	Retourne la quantité de houblon stockée dans l'entrepôt
* \details	Retourne la quantité de houblon stockée dans l'entrepôt et
*		vérifie sa validité (ne doit pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \return	Un entier non signé
*/
unsigned int getHoublonEntr(const Entrepot *pstock);

/**
* \brief	Retourne la quantité de nourriture stockée dans l'entrepôt
* \details	Retourne la quantité de nourriture stockée dans l'entrepôt et
*		vérifie sa validité (ne doit pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \return	Un entier non signé
*/
unsigned int getNourritureEntr(const Entrepot *pstock);

/**
* \brief	Retourne la quantité de bière stockée dans l'entrepôt
* \details	Retourne la quantité de bière stockée dans l'entrepôt et
*		vérifie sa validité (ne doit pas être négatif)
* \return	Un entier non signé
* \param	pstock		Pointeur sur l'Entrepôt
*/
unsigned int getBiereEntr(const Entrepot *pstock);

/**
* \brief	Retourne le bonus a la vitesse de production lié aux technologies
* \details	Retourne le bonus a la vitesse de production lié aux technologies
* \return	Un entier
* \param	pstock		Pointeur sur l'Entrepôt
*/
int getBonusProd(const Entrepot *pstock);

/*============================== Mutateurs ==============================*/
/**
* \brief	Change la valeur indiquant la quantité de bois de l'entrepôt
* \details	Ajoute à la quantité actuelle de bois une valeur entière
*		passée en argument, après vérification (le résultat ne peut
*		pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \param	quantite	Un entier. Une valeur positive s'ajoutera à
*				la quantité actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteBoisEntr(Entrepot *pstock, int quantite);

/**
* \brief	Change la valeur indiquant la quantité de métal de l'entrepôt
* \details	Ajoute à la quantité actuelle de métal une valeur entière
*		passée en argument, après vérification (le résultat ne peut
*		pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \param	quantite	Un entier. Une valeur positive s'ajoutera à
*				la quantité actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteMetalEntr(Entrepot *pstock, int quantite);

/**
* \brief	Change la valeur indiquant la quantité de houblon de l'entrepôt
* \details	Ajoute à la quantité actuelle de houblon une valeur entière
*		passée en argument, après vérification (le résultat ne peut
*		pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \param	quantite	Un entier. Une valeur positive s'ajoutera à
*				la quantité actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteHoublonEntr(Entrepot *pstock, int quantite);

/**
* \brief	Change la valeur indiquant la quantité de nourriture de
*		l'entrepôt
* \details	Ajoute à la quantité actuelle de nourriture une valeur entière
*		passée en argument, après vérification (le résultat ne peut
*		pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \param	quantite	Un entier. Une valeur positive s'ajoutera à
*				la quantité actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteNourritureEntr(Entrepot *pstock, int quantite);

/**
* \brief	Change la valeur indiquant la quantité de bière de l'entrepôt
* \details	Ajoute à la quantité actuelle de bière une valeur entière
*		passée en argument, après vérification (le résultat ne peut
*		pas être négatif)
* \param	pstock		Pointeur sur l'Entrepôt
* \param	quantite	Un entier. Une valeur positive s'ajoutera à
*				la quantité actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteBiereEntr(Entrepot *pstock, int quantite);

/**
* \brief	Change la valeur de vitesse de production
* \details	Ajoute le nouveau modificateur de vitesse de production à la valeur actuelle
* \param	pstock		Pointeur sur l'Entrepôt
* \param	modificateur	Un entier. Une valeur positive s'ajoutera à
*				la valeur actuelle ; pour diminuer la valeur
*				actuelle, passer une valeur négative.
*/
void ajouteModifProd(Entrepot *pstock, int modificateur);

/*========================== Fonctions de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module Entrepot
* \details	Teste les différentes fonctions du module Entrepot en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testEntrepot();

#endif
